<?php
//桥接模式bridge
// 抽象化角色，抽象化给出的定义，并保存一个对实现化对象的引用。
abstract class Abstraction {
    // 对实现对象的引用
    protected $imp;
    public function operation(){
        $this->imp->operationImp();
    }
}

// 修正抽象化角色, 扩展抽象化角色，改变和修正父类对抽象化的定义。
class RefinedAbstraction extends Abstraction {
    public function __contruct(Implementor $imp){
        $this->imp=$imp;
    }
    public function operation()
    {
        // parent::operation(); // TODO: Change the autogenerated stub
        $this->imp->operationImp();
    }
}
// 实现化角色, 给出实现化角色的接口，但不给出具体的实现。

abstract class Implementor {
    abstract public function operationImp();
}
// 具体化角色A
class ConcreteImplementorA  extends Implementor{
    public function operationImp()
    {
        // TODO: Implement operationImp() method.
    }
}
// 具体化角色B
class ConcreteImplementorB extends Implementor{
    public function operationImp()
    {
        // TODO: Implement operationImp() method.
    }
}

// client
$abstraction = new RefinedAbstraction(new ConcreteImplementorA());
$abstraction->operation();

$abstraction = new RefinedAbstraction(new ConcreteImplementorB());
$abstraction->operation();
